package com.smart.platform.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.smart.platform.common.Result;
import com.smart.platform.common.ocr.OcrOnlyText;
import com.smart.platform.entity.Respond;
import com.smart.platform.entity.Students;
import com.smart.platform.entity.TeaClasses;
import com.smart.platform.entity.Text;
import com.smart.platform.service.*;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;


//这个控制层主要是处理 前端发送试卷批阅请求的时候 将
//识别到的内容传递给 文心模型 并将评语返回 用于后续的数据回显 并修改
@Slf4j
@RestController
@RequestMapping("/respond")
//@Api(tags = "学生作答添加接口")
public class RespondController {

    @Autowired
    private RespondService respondService;

    @Autowired
    private Ocrservice ocrservice;

    @Autowired
    private TeaClassesService teaClassesService;

    @Autowired
    private TextService textService;

    @Autowired
    private WenXinService wenXinService;

    @Autowired
    private StudentsService studentsService;

    /*
     * 此处是针对单次学生作答内容添加的方法 每次上传一个科目一道题的作答
     * 前端 需要传递图片的原始 file 和 将其转换成base64编码的数据
     * 所以这一层方法处了要调用ocr以外 还需要请求 upload方法用于在云端保存图片
     * 所以这里应该是分两个请求 一次请求upload 一次请求save
     * 点击添加学生作答内容以后 请求数据发送（但还没有提交）
     * 再点击图片上传时 前端需要请求一次upload接口 将图片保存的云端 并返回url将其保存在实体类的image当中
     * 这样在后续点击提交以后 image便有了具体的内容 可以用于设置 并请求ocr方法
     * @param respond
     * @return
     */
    @ApiOperation(value = "学生作答添加接口", notes = "考次 科目 题目 图片url userId")
    @PostMapping("/save")
    public Result<String> save(@RequestBody Respond respond) {
        log.info("新增学生作答信息：{}", respond.toString());

        List<OcrOnlyText> ocrTexts = ocrservice.ocrText(respond.getImage());
        List<String> str = new ArrayList<>();
        for (OcrOnlyText ocrText : ocrTexts) {
            str.add(ocrText.getText());
        }
        //将返回的OCR数据转化为字符串
        String answer = String.join(" ", str);
        respond.setContent(answer);

        LambdaQueryWrapper<Text> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Text::getState, respond.getState())
                .eq(Text::getCourse, respond.getCourse())
                .eq(Text::getNumber, respond.getNumber());

        Text text = textService.getOne(queryWrapper);
        String question = text.getQuestion();
        int valueMax = text.getScore();

        //通过state course number 去text里面查题目 拿出来 String question 和 valueMax
        //调文心 把刚刚拿到的 content 以及查出来的 question 一起传给 传递给文心 文心返回的数据
        //文心返回的数据 就存入数据库当中的 comment respond.setComment = comment
        respond.setComment(wenXinService.dealQuestion(question, valueMax, answer).getComment());

        log.info("学生上传的作答信息:{}", respond);
        respondService.save(respond);
        return Result.success("学生作答内容添加成功");
    }


    /**
     * 获取当前登录教师下所管理学生的学号信息
     * 通过年级 班级 和 老师的工号来进行定位查询
     * 获取教师所管理的班级学生成绩信息
     * classes grade ->teaClasses
     * 需要根据 state course  和 number 去 respond表当中查这个userid下有没有数据
     * 如果有数据 说明的是已经上传了
     *
     * @param
     * @return
     */
    @ApiOperation(value = "获取当前登录教师所管理的某个班级的全体学生学号", notes = "需要传递年级（grade）和班级信息（classes）")
    //@GetMapping("/StudentList")
    public Result<List<Students>> StudentList(Integer classes, Integer grade) {

        List<Students> list = respondService.AllList(classes, grade);

        return Result.success(list);
        /*List<Students> studentsListNo = new ArrayList<>();
        List<Students> studentsListYse = new ArrayList<>();

        list.stream().map((item) ->{
            LambdaQueryWrapper<Respond> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(Respond::getUserId,item.getUserId())
                    .eq(Respond::getState,text.getText().getState())
                    .eq(Respond::getCourse,text.getText().getCourse())
                    .eq(Respond::getNumber,text.getText().getNumber());
            Respond one = respondService.getOne(queryWrapper);
            if (one == null){//如果
                studentsListNo.add(item);
            }else {
                studentsListYse.add(item);
            }
            return item;
        });
        RespondStu respondStu = new RespondStu(studentsListNo,studentsListYse);*/
    }
    //根据当前session 获取到老师的userid 然后将其作为条件查询 去 TC表中查出来它管理的班级 和 年级
    //再去student表中 根据班级和年级 查询对应学生的学号

    /**
     * 获取当前登录教师所管理的班级信息
     *
     * @param request
     */
    @ApiOperation(value = "获取当前登录教师所管理的年级和班级信息", notes = "当前登录教师的工号通过session获取 前端不需要传递信息")
    @GetMapping("/StudentList")
    public Result<List<Students>> ClassesList(HttpServletRequest request) {
        //通过当前登录教师的session获取到的userId（工号）
        String userId = (String) request.getSession().getAttribute("userId");

        LambdaQueryWrapper<TeaClasses> queryWrapper = new LambdaQueryWrapper<>();

        queryWrapper.eq(TeaClasses::getUserId, userId);

        TeaClasses list = teaClassesService.getOne(queryWrapper);
        LambdaQueryWrapper<Students> StudentQueryWrapper = new LambdaQueryWrapper<>();
        StudentQueryWrapper.eq(Students::getGrade, list.getGrade())
                .eq(Students::getClasses, list.getClasses());

        List<Students> studentsList = studentsService.list(StudentQueryWrapper);
        //返回去的数据中前端需要接受的是grade和classes 用于后续的数据选择
        return Result.success(studentsList);
    }

    /**
     * 根据state course number userid 查看当前学生的作答数据和文心评阅 用于后续修改成绩
     *
     * @param state
     * @param course
     * @param number
     * @param userId
     * @return
     */
    @ApiOperation(value = "查看当前学生作答信息 用于后续修改成绩")
    @GetMapping
    public Result<Respond> get(Integer state, Integer course, Integer number, String userId) {
        LambdaQueryWrapper<Respond> queryWrapper = new LambdaQueryWrapper<>();

        queryWrapper.eq(Respond::getState, state)
                .eq(Respond::getCourse, course)
                .eq(Respond::getNumber, number)
                .eq(Respond::getUserId, userId);

        Respond one = respondService.getOne(queryWrapper);
        return Result.success(one);
    }


    /**
     * 修改评语 前端传递的数据中默认转递status为1
     *
     * @param text
     * @return
     */
    @ApiOperation(value = "文心评语内容的二次修改", notes = "需要题目的id")
    @PutMapping("/update")
    public Result<String> update(@RequestBody Text text) {
        log.info("修改后的信息:{}", text.toString());

        textService.updateById(text);

        return Result.success("修改成功");
    }


}
